package com.atguigu.schedule.mapper;

import com.atguigu.schedule.pojo.FaceData;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 人脸数据Mapper接口
 * 
 * @author atguigu
 * @since 2024
 */
@Mapper
public interface FaceDataMapper {
    
    /**
     * 插入人脸数据
     * 
     * @param faceData 人脸数据
     * @return 影响行数
     */
    int insert(FaceData faceData);
    
    /**
     * 根据ID查询人脸数据
     * 
     * @param id 数据ID
     * @return 人脸数据
     */
    FaceData selectById(@Param("id") Long id);
    
    /**
     * 根据人员姓名查询人脸数据
     * 
     * @param personName 人员姓名
     * @return 人脸数据列表
     */
    List<FaceData> selectByPersonName(@Param("personName") String personName);
    
    /**
     * 根据人员姓名查询启用的人脸数据
     * 
     * @param personName 人员姓名
     * @return 人脸数据列表
     */
    List<FaceData> selectByPersonNameAndEnabled(@Param("personName") String personName);
    
    /**
     * 查询所有启用的人脸数据
     * 
     * @return 人脸数据列表
     */
    List<FaceData> selectByEnabled();
    
    /**
     * 根据人员姓名删除人脸数据
     * 
     * @param personName 人员姓名
     * @return 影响行数
     */
    int deleteByPersonName(@Param("personName") String personName);
    
    /**
     * 检查人员是否存在
     * 
     * @param personName 人员姓名
     * @return 是否存在
     */
    boolean existsByPersonName(@Param("personName") String personName);
    
    /**
     * 统计人员的人脸样本数量
     * 
     * @param personName 人员姓名
     * @return 样本数量
     */
    long countByPersonName(@Param("personName") String personName);
    
    /**
     * 根据时间范围查询人脸数据
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 人脸数据列表
     */
    List<FaceData> selectByCreatedAtBetween(@Param("startTime") LocalDateTime startTime, 
                                           @Param("endTime") LocalDateTime endTime);
    
    /**
     * 查询所有不重复的人员姓名
     * 
     * @return 人员姓名列表
     */
    List<String> selectDistinctPersonNames();
    
    /**
     * 更新人脸数据
     * 
     * @param faceData 人脸数据
     * @return 影响行数
     */
    int update(FaceData faceData);
    
    /**
     * 删除人脸数据
     * 
     * @param id 数据ID
     * @return 影响行数
     */
    int deleteById(@Param("id") Long id);
    
    /**
     * 查询所有人脸数据
     * 
     * @return 人脸数据列表
     */
    List<FaceData> selectAll();
}
